#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

/*------------------------thread----------------------------*/
#define NUM 3

void* handler_one(void* arg)
{
  const char* msg = (const char*)arg;
  printf("I am %s, tid: 0x%X\n", msg, pthread_self());
  sleep(1);
  // 进程退出
  // return (void*)("one");
  pthread_exit((void*)"one");
}


void* handler_two(void* arg)
{
  const char* msg = (const char*)arg;
  sleep(7);
  printf("I am %s, tid: 0x%X\n", msg, pthread_self());
  //int* p = NULL;
  //*p = 100;

  return (void*)("two");
}

void* handler_three(void* arg)
{
  const char* msg = (const char*)arg;
  while(1)
  {
    printf("I am %s, tid: 0x%X\n", msg, pthread_self());
    sleep(1);
  }
  return (void*)("three");
}

int main()
{
  // tid数组
  pthread_t tid[NUM];
  // handler函数指针数组
  void* (*handler[NUM])(void*) = {handler_one, handler_two, handler_three};
  // arg变量数组
  const char* arg[NUM] = {"thread 1", "thread 2", "thread 3"};
  int i;
  for(i = 0; i < NUM; ++i)
  {
    // 线程创建
    pthread_create(tid+i, NULL, handler[i], (void*)arg[i]);
  }

  // 线程取消
  sleep(5);
  printf("cancel pthread\n");
  pthread_cancel(tid[2]);
  printf("cancel pthread success\n");
  
  // 线程分离
  pthread_detach(tid[1]);

  // 线程等待
  char* ret[3];
  for(i = 0; i < NUM; ++i)
  {
    pthread_join(tid[i], (void**)&(ret[i]));
    // 因此线程3被主动取消，因此他的返回值是-1
    if(i == 2)
      printf("%d ret is %d\n", i, ret[i]);
    else 
      printf("%d ret is %s\n", i, ret[i]);
  }
  
  sleep(10);

  /*--主函数打印创建的线程tid--*/
  // while(1)
  // {
  //   printf("------------------begin--------------------------\n");
  //   for(int i = 0; i < NUM; ++i)
  //   {
  //     printf("I am main thread, creat child id: %lu\n", tid[i]);
  //   }
  //   sleep(10);
  //   printf("-------------------end---------------------------\n");
  // }
    
  return 0;
}




/*-------------------线程创建------------------------*/
//void* handler(void* arg)
//{
//  const char* msg = (const char*)arg;
//  while(1)
//  {
//    printf("I am new thread:%s, pid:%d", msg, getpid());
//    sleep(1);
//  }
//  return (void*)0;
//}
//
//int main()
//{
//  pthread_t pid;
//  pthread_create(&pid, NULL, handler, (void*)"thread 1");
//
//  // 主线程
//  while(1)
//  {
//    printf("I am main thread, pid:%d\n", getpid());
//    sleep(1);
//  }
//  return 0;
//}
